package com.shkco.basic.service.impl;

import com.shkco.basic.dto.SmsCodeDto;
import com.shkco.basic.exception.BusinessException;
import com.shkco.basic.service.IVerifyCodeService;
import com.shkco.basic.util.SmsUtils;
import com.shkco.basic.util.StrUtils;
import com.shkco.basic.util.VerifyCodeUtils;
import com.shkco.user.domain.User;
import com.shkco.user.mapper.UserMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;
@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private UserMapper userMapper;


    @Override
    public String image(String key) {
        // 使用工具类生成图形验证码
        String code = StrUtils.getComplexRandomString(4);
        // 保存到redis
        redisTemplate.opsForValue().set(key,code,5, TimeUnit.MINUTES);
        String base64Str = VerifyCodeUtils.verifyCode(110, 40, code);
        return base64Str;
    }

    @Override
    public void smsCode(SmsCodeDto smsCodeDto) {
        String imageCode = smsCodeDto.getImageCode();
        String imageCodeKey = smsCodeDto.getImageCodeKey();
        String phone = smsCodeDto.getPhone();
        if (StringUtils.isEmpty(phone)){
            throw new BusinessException("手机号不能为空！");
        }
        if (StringUtils.isEmpty(imageCode)){
            throw new BusinessException("图形验证码不能为空！");
        }

        Object o = redisTemplate.opsForValue().get(imageCodeKey);

        if (o == null){
            throw new BusinessException("图形验证码过期，请刷新页面重新获取！");
        }
        if (!o.toString().equalsIgnoreCase(imageCode)){
            throw new BusinessException("图形验证码错误！请重新输入！");
        }

        User user = userMapper.findByPhone(phone);
        if (user != null){
            throw new BusinessException("账号已存在！请勿重复注册！");
        }
        // 获取手机验证码，判断是否过期
        Object obj = redisTemplate.opsForValue().get("register:" + phone);
        String smsCode = null;
        if (obj == null){
            // 过期了或者没有，通过工具类生成
            smsCode = StrUtils.getRandomString(4);
        } else {
            // 没有过期,获取时间戳
            long time = Long.parseLong(obj.toString().split(":")[1]);
            // 判断是否过重发时间
            if ((System.currentTimeMillis() - time) < 60 * 1000){
                // 如果没有过重发时间,抛出异常
                throw new BusinessException("操作过于繁忙！请稍后重试！");
            }
            // 如果过了重发时间,使用上面的验证码
            smsCode = obj.toString().split(":")[0];
        }
        // 保存到redis  重新设置3分钟过期
        redisTemplate.opsForValue().set("register:" + phone,smsCode + ":" + System.currentTimeMillis(),3,TimeUnit.MINUTES);
        // 调用工具类发送短信
//        SmsUtils.sendSms(phone,"你的验证码为：" + smsCode + ",请在三分钟内使用！");
        System.out.println("你的验证码为：" + smsCode + ",请在三分钟内使用！");
    }

    @Override
    public void binderSmsCode(SmsCodeDto smsCodeDto) {
        String phone = smsCodeDto.getPhone();
        if (StringUtils.isEmpty(phone)){
            throw new BusinessException("手机号不能为空！");
        }
        // 获取手机验证码，判断是否过期
        Object obj = redisTemplate.opsForValue().get("binder:" + phone);
        String smsCode = null;
        if (obj == null){
            // 过期了或者没有，通过工具类生成
            smsCode = StrUtils.getRandomString(4);
        } else {
            // 没有过期,获取时间戳
            long time = Long.parseLong(obj.toString().split(":")[1]);
            // 判断是否过重发时间
            if ((System.currentTimeMillis() - time) < 60 * 1000){
                // 如果没有过重发时间,抛出异常
                throw new BusinessException("操作过于繁忙！请稍后重试！");
            }
            // 如果过了重发时间,使用上面的验证码
            smsCode = obj.toString().split(":")[0];
        }
        // 保存到redis  重新设置3分钟过期
        redisTemplate.opsForValue().set("binder:" + phone,smsCode + ":" + System.currentTimeMillis(),3,TimeUnit.MINUTES);
        // 调用工具类发送短信
//        SmsUtils.sendSms(phone,"你的验证码为：" + smsCode + ",请在三分钟内使用！");
        System.out.println("你的验证码为：" + smsCode + ",请在三分钟内使用！");
    }

}
